iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Web 3

Smart-Contract Language: Move系列 第 5

Day 5 Constants & Import

  • 分享至 

  • xImage
  •  

Constants

一種在 Script 和 Module 中共享靜態值的方法,必須在編譯時就確認值,該值存在編譯的 Module or Script 中 (無法使用 public)。每次使用該常量時,都會複製一份去使用

宣告

常量聲明以const關鍵字開頭,後跟名稱、類型和值。它們可以存在於 Script 或 Module 中

const <name>: <type> = <expression>;
script {

    const MY_ERROR_CODE: u64 = 0;

    fun main(input: u64) {
       ...
    }

}

address 0x42 {
module Example {

    const MY_ADDRESS: address = @0x42;

    public fun permissioned(s: &signer) {
        ...
    }

}
}

有效表達式

目前只支援原始類型 bool, u8, u64, u128, address, vector<u8>

複雜表達

除了常用的文字,常量還可以包含更複雜的表達式,只要編譯器能夠在編譯時將表達式簡化為一個值即可

const RULE: bool = true && false;
const CAP: u64 = 10 * 100 + 1;
const SHIFTY: u8 = {
  (1 << 1) * (1 << 2) * (1 << 3) * (1 << 4)
};
const HALF_MAX: u128 = 340282366920938463463374607431768211455 / 2;
const EQUAL: bool = 1 == 1;

Import

可以導入公開的 Module 或標準庫來使用,關鍵字是 use

schema

// <Address>是發布者的地址,<ModuleName>是 Module 的名稱。
use <Address>::<ModuleName>;

訪問 Module 的內容

要訪問導入 module 的方法(或類型),請使用::符號。就這麼簡單 - 只能有一個級別的定義,因此在 Module 中定義的所有內容(公開)都可以通過雙冒號訪問。

script {
    use 0x1::Vector;

    fun main() {
        // here we use method empty() of module Vector
        // the same way we'd access any other method of any other module
        let _ = Vector::empty<u64>();
    }
}

在 Script 中使用

必須放在 Script {} 塊內

script {
    use 0x1::Vector;

    // in just the same way you can import any
    // other module(s). as many as you want!

    fun main() {
        let _ = Vector::empty<u64>();
    }
}

在 Module 中使用

必須在module {}塊內

module Math {
    use 0x1::Vector;

    // the same way as in scripts
    // you are free to import any number of modules

    public fun empty_vec(): vector<u64> {
        Vector::empty<u64>();
    }
}

指定導入

導入時可以擴展,指定想要使用的成員

script {
    // single member import
    use 0x1::Signer::address_of;

    // multi member import
    use 0x1::Vector::{
        empty,
        push_back
    };

    fun main(acc: &signer) {
        // use functions without module access
        let vec = empty<u8>();
        push_back(&mut vec, 10);

        // same here
        let _ = address_of(acc);
    }
}

使用 Self 代表 Module 本身

script {
    use 0x1::Vector::{
        Self, // Self == Imported module
        empty
    };

    fun main() {
        // `empty` imported as `empty`
        let vec = empty<u8>();

        // Self means Vector
        Vector::push_back(&mut vec, 10);
    }
}

導入後更改名稱

當有命名衝突發生時,可以使用 as 來更改導入模塊的名字

schema

use <Address>::<ModuleName> as <Alias>;

example

script {
    use 0x1::Vector as V; // V now means Vector

    fun main() {
        V::empty<u64>();
    }
}

複習

我們複習一下到目前為止介紹的內容

  • Script: function 執行進入點

    naming:lower snake case ,與 file 內 function 名字一樣

  • Module: 定義 struct type 和對這些資源做操作的 function 庫

    naming: camel case,例如 FixedPoint

  • Integers: 支援三種數字類型,可以使用 as 來轉換成相同類型

  • 使用 let 來宣告變量,有許多聲明模式可以使用,並搭配自動型別端段或自行添加類型註解,以及相關的用法,像是陰影

  • Scope 與 Express 的使用

  • 使用 const 來宣告常量 (在 Script 和 Module 中共享靜態值的方法)

  • 使用 use 導入其他 Module 或 標準庫使用,導入同時,可以使用 self 代表自己或是擴展來指定

讓我們 Move to Day6


上一篇
Day 4 Expression and Scope
下一篇
Day 6 Function
系列文
Smart-Contract Language: Move30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言